/*
 * importadorMails.cpp
 *
 *  Created on: 11/09/2010
 *      Author: julfc
 */

#include "ImportadorMails.h"

ImportadorMails::ImportadorMails() {

}


bool ImportadorMails::bajarmails(string server, string user, string pass,
		string archivo, string archivoIndiceUnico, QTextEdit* bigEditor) {

#define USE_SSL

	pop3sock_t mysock;
	char myservername[64];
	char username[64];
	char password[64];

	struct hostent myserver;
	struct sockaddr_in myconnection;

	char* srvdata=NULL;
	char* mymessage=NULL;
	int* mylist;
	char *ptr_port;
	int nport;
	int i=1, last; /* 'i'ndex, 'last' cell of an array */

	strcpy(myservername, server.c_str());
	strcpy(username, user.c_str());
	strcpy(password, pass.c_str());

	ptr_port = strchr (myservername, ':');
	if (ptr_port) {
		*ptr_port = 0;
		nport = (int) strtoul (++ptr_port, NULL, 10);
		if (!nport) nport = 110;
	} else nport = 110;

	libspopc_init();

	mysock=pop3_prepare(myservername,nport,&myconnection,&myserver);


	//pop3_cert_setup
	ostringstream oss;
	oss << "[ssl-cert]";
	const char* ssl = oss.str().c_str();
	pop3_cert_setup(ssl);
	pop3_ssl_auto();

	QString mensajeUsuario;

	if(BAD_SOCK==mysock){
		mensajeUsuario = "Revise su conexion a internet...";
		bigEditor->append(mensajeUsuario);
		return false /*"Problemas con la red."*/;
	}
	srvdata=pop3_connect(mysock,&myconnection);
	if (!srvdata){
		mensajeUsuario = "Problema al conectarse a la casilla de correo, revise su configuracion.";
		bigEditor->append(mensajeUsuario);
		return false /*"Problemas de conectividad."*/;
	}
	free(srvdata);
	srvdata=pop3_user(mysock,username);
	free(srvdata);
	srvdata=pop3_pass(mysock,password);
	free(srvdata);

	mensajeUsuario = "Estado de la casilla:";
	bigEditor->append(mensajeUsuario);
	srvdata=pop3_stat(mysock);
	mensajeUsuario.clear();
	mensajeUsuario = QString("    Cantidad de mails: %1").arg(stat2num(srvdata));
	bigEditor->append(mensajeUsuario);
	mensajeUsuario.clear();
	mensajeUsuario = QString("    Tamanio total: %1 bytes").arg(stat2bytes(srvdata));
	bigEditor->append(mensajeUsuario);
	free(srvdata);

	mensajeUsuario.clear();
	mensajeUsuario = "Preparando la descarga de los mails...";
	bigEditor->append(mensajeUsuario);
	srvdata=pop3_list(mysock,0);
	mylist=list2array(srvdata);
	free(srvdata);
	last=mylist?mylist[0]:0;

	char myarchivo[64];
	strcpy(myarchivo, archivo.c_str());
	ManejadorArchivoUnico accesoDatos = ManejadorArchivoUnico(myarchivo, CREAR);
	ArbolBSharp arbolUnico;
	char myarchivo2[64];
	strcpy(myarchivo2, archivoIndiceUnico.c_str());
	arbolUnico.Crear(myarchivo2);

	RegistroBSharp registro;

	//Creo las cosas para hacer el diccionario.
	Diccionario diccionario;
	diccionario.crearArchivos();

	ManejadorConfiguracion mc;
	mc.guardarCantidadMails(last);
	//i = 41;
	int reintentos = 0;
	while(i < (last+1)){
		if (reintentos == 0) {
			mensajeUsuario.clear();
			mensajeUsuario = QString("Bajando mail %1 de %2")
		        				  .arg(i)
		        				  .arg(last);
			bigEditor->append(mensajeUsuario);
			mensajeUsuario.clear();
			mensajeUsuario = QString("    El tamanio es %1 bytes")
		        				  .arg(mylist[i]);
			bigEditor->append(mensajeUsuario);
			QCoreApplication::processEvents();
		}
		srvdata=pop3_retr(mysock,i);
		if((!srvdata)||pop3_error(srvdata)) {
			mensajeUsuario.clear();
			mensajeUsuario = QString("Se produjo un error al descargar el mail...");
			bigEditor->append(mensajeUsuario);
			mensajeUsuario.clear();
			if (reintentos < 3) {
				reintentos++;
				mensajeUsuario = QString("   Reintentando... %1 de 3").arg(reintentos);
				bigEditor->append(mensajeUsuario);
				mensajeUsuario.clear();
				QCoreApplication::processEvents();
				sleep(7);

			} else {
				mensajeUsuario.clear();
				mensajeUsuario = QString("\nSe supero la cantidad de reintentos, se omitira el mail %1.\n").arg(i);
				bigEditor->append(mensajeUsuario);
				mensajeUsuario.clear();
				QCoreApplication::processEvents();
				i++;
				reintentos = 0;
			}
		} else {
			mymessage=retr2msg(srvdata);
			free(srvdata);
			//Guardo el mail.
			if (mymessage != NULL) {
				long numBloque= accesoDatos.escribirMail(i, mymessage, mylist[i]);
				registro.clave = i;
				registro.valor = numBloque;
				arbolUnico.InsertarRegistro(registro);
				long tamaMaxMail = accesoDatos.getTamanioBloques() - 16;
				if (mylist[i] > tamaMaxMail) {
					char* mailTruncado;
					mailTruncado = truncarMail(mymessage, tamaMaxMail);
					insertarEnDiccionario(diccionario, mailTruncado, i);
					free(mailTruncado);
				} else {
					insertarEnDiccionario(diccionario, mymessage, i);
				}
			} else {
				mensajeUsuario.clear();
				mensajeUsuario = QString("\nHubo problemas al descargar el mail, se omitira el mail %1, la conexion esta inestable...\n").arg(i);
				bigEditor->append(mensajeUsuario);
				mensajeUsuario.clear();
				QCoreApplication::processEvents();
			}
			free(mymessage);
			mymessage=NULL;
			reintentos = 0;
			i++;
		}
	}
	free(mylist);mylist=NULL;

	mensajeUsuario.clear();
	mensajeUsuario = "Reseteando la conexion...";
	bigEditor->append(mensajeUsuario);
	srvdata=pop3_rset(mysock);
	free(srvdata);srvdata=NULL;

	srvdata=pop3_quit(mysock);
	free(srvdata); srvdata=NULL;
	pop3_disconnect(mysock, &myserver);

	libspopc_clean();

	return true /*"Importacion realizada con exito!"*/;
}

bool ImportadorMails::insertarEnDiccionario(Diccionario diccionario, char* mail, int id) {
	Mail mailUtil;
	string mailStr = mailUtil.mailToString(mail);
	if (mailStr.compare("") == 0) {
		return false;
	}
	ItemDiccionario item = diccionario.obtenerVectorPalabrasMail(mailStr, id);
	bool result = diccionario.insertarEnArbol(item);
	return result;
}

char* ImportadorMails::truncarMail (char* mail, long tamanio_maximo_mail) {
	char* mailTruncado;
	mailTruncado = (char*) malloc(tamanio_maximo_mail + 1);
	mailTruncado[tamanio_maximo_mail]='\0';
	memcpy(mailTruncado, mail, tamanio_maximo_mail);
	return mailTruncado;
}

ImportadorMails::~ImportadorMails() {
	// TODO Auto-generated destructor stub
}
